package com.alibaba.otter.canal.instance.core;

import com.alibaba.otter.canal.common.CanalLifeCycle;
import com.alibaba.otter.canal.common.alarm.CanalAlarmHandler;
import com.alibaba.otter.canal.meta.CanalMetaManager;
import com.alibaba.otter.canal.parse.CanalEventParser;
import com.alibaba.otter.canal.protocol.ClientIdentity;
import com.alibaba.otter.canal.sink.CanalEventSink;
import com.alibaba.otter.canal.store.CanalEventStore;

/**
 * 代表单个canal实例，比如一个destination会独立一个实例
 * instance模块其实是把这几个模块组装在一起，为客户端的binlog订阅请求提供服务。有些模块都有多种实现，不同组合方式，最终确定了一个CanalInstance的工作逻辑。
 *
 * @author jianghang 2012-7-12 下午12:04:58
 * @version 1.0.0
 */
public interface CanalInstance extends CanalLifeCycle {
    // 这个instance对应的destination
    String getDestination();

    /**
     * CanalEventParser接口实现类：
     *    MysqlEventParser：伪装成单个mysql实例的slave解析binglog日志
     *    GroupEventParser：伪装成多个mysql实例的slave解析binglog日志。
     *        内部维护了多个CanalEventParser。
     *        主要应用场景是分库分表：比如产品数据拆分了4个库，位于不同的mysql实例上。正常情况下，我们需要配置四个CanalInstance。对应的，业务上要消费数据时，需要启动4个客户端，分别链接4个instance实例。
     *        为了方便业务使用，此时我们可以让CanalInstance引用一个GroupEventParser，由GroupEventParser内部维护4个MysqlEventParser去4个不同的mysql实例去拉取binlog，最终合并到一起。
     *        此时业务只需要启动1个客户端，链接这个CanalInstance即可.
     *    LocalBinlogEventParser：解析本地的mysql binlog。例如将mysql的binlog文件拷贝到canal的机器上进行解析。
     */
    // 数据源接入，模拟slave协议和master进行交互，协议解析，位于canal.parse模块中
    CanalEventParser getEventParser();

    /**
     * CanalEventSink接口实现类：
     *    EntryEventSink
     *    GroupEventSink：基于归并排序的sink处理
     */
    // parser和store链接器，进行数据过滤，加工，分发的工作，位于canal.sink模块中
    CanalEventSink getEventSink();

    /**
     * CanalEventStore接口实现类：
     *    目前只有MemoryEventStoreWithBuffer，基于内存buffer构建内存memory store
     */
    // 数据存储，位于canal.store模块中
    CanalEventStore getEventStore();

    /**
     * CanalMetaManager：
     *     ZooKeeperMetaManager：将元数据存存储到zk中
     *     MemoryMetaManager：将元数据存储到内存中
     *     MixedMetaManager：组合memory + zookeeper的使用模式
     *     PeriodMixedMetaManager：基于定时刷新的策略的mixed实现
     *     FileMixedMetaManager：先写内存，然后定时刷新数据到File
     */
    // 增量订阅&消费元数据管理器，位于canal.meta模块中
    CanalMetaManager getMetaManager();


    // 告警，位于canal.common块中
    CanalAlarmHandler getAlarmHandler();
    // 客户端发生订阅/取消订阅行为
    boolean subscribeChange(ClientIdentity identity);

    CanalMQConfig getMqConfig();
}
